הפעם אני אלמד אתכם עוד כמה דברים: איך לבחור איזו פעולה תקרה ובאיזה קונטרולר להשתמש.
לחץ כאן בכדי להגיע לחלק הראשון של המדריך.
בחלק הקודם של המדריך דיברנו על התקנת Yii והסברנו מה זה קונטרולרים.
הפעם אני אלמד אתכם עוד כמה דברים: איך לבחור איזו פעולה תקרה ובאיזה קונטרולר להשתמש.
ב-GET זה ישמש בשם r. אם הוא לא קיים, זה יהיה הקונטרולר הראשי + הפעולה הראשית, שזה אומר שאם לא עשינו GET כזה (r), ה-r יהיה שווה ל-main/index. במקרה שלנו - ControllerName/Action.
עכשיו ניצור בקונטרולר הראשי פעולה שתיקרא hello. כמו שאמרתי בחלק הקודם, שם פעולה הוא action ולאחריו השם שאנחנו רוצים.
protected/controller/MainController.php
<?php
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello()
{
echo "Hello";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello()
{
echo "Hello";
}
}
?>
אם נכנס עכשיו לדף, עדיין נראה hello world, מכיוון שהפעולה הראשית תבוצע אוטומטית כי שלא הגדרנו איזו פעולה לעשות. לכן נוסיף לכתובת את ה-GET בשם r שיכיל main/hello, כלומר: index.php?r=main/hello - שזה אומר שהפעולה hello שנמצאת ב-Controller בשם main תרוץ.
--- מקווה שהסברתי טוב; אם לא הבנתם - תשאלו, ואשתדל להסביר יותר טוב. ---
עכשיו נגרום לכך שהפעולה Hello תדפיס גם למי להגיד שלום, זאת לפי ה-GET. אפשר להשתמש ב-$_GET, אבל YII נותנת אפשרות להשתמש ב-GET דרך הפעולה, פשוט מוסיפים משתנה לפונקציה hello בשם של ה-get.
נניח שאני רוצה לקרוא מה-get בשם name - אני אוסיף לפונקציה משתנה בשם name.
<?php
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello($name)
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello($name)
{
echo "Hello $name";
}
}
?>
לדוגמה, הכתובת index.php?r=main/hello&name=David תדפיס Hello David.
אבל, אם נוריד את ה-get בשם name נקבל שגיאה, בגלל שה-get בשם name לא קיים. לכן נגרום לכך שאם ה-GET בשם name לא קיים, הוא יכיל את המחרוזת Guest, אז פשוט נכתוב $name="Guest", כך:
<?php
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
echo "hello world";
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
מה שאומר שאם ה-GET בשם name לא קיים, הפונקציה תדפיס Hello Guest, אבל אם הוא קיים הוא ידפיס Hello $name.
עכשיו אני אלמד אותכם לרנדר; זה נעשה ע"י פונקציה בשם render. כל הקבצי הרנדור יהיו בתיקייה protected/views. לכל controller יש תיקייה של רינדור בשם של ה-controller. לדוגמה, כל קבצי הרינדור של הקונטרולר main נמצאים בתיקייה protected/views/main. עכשיו נדפיס תיבת התחברות, נעשה בפעולה הראשית רנדר ל-login, כך:
<?php
class MainController extends CController
{
public function actionIndex()
{
$this->render("login");
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
$this->render("login");
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
אם נריץ את האתר עכשיו נקבל שגיאה, כי הקובץ login.php (כעושים רינדור אין צורך להוסיף .php) לא נמצא.
אז בואו ניצור את הקובץ login.php בשביל הרינדור.
protected/views/main/login.php
<h1>Login</h1>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
אני לא חושב שאני צריך להסביר מה הקוד הזה עושה...
אני מדגיש עוד פעם: כשמרנדרים, לא לשכוח ליצור תיקייה של הקונטרולר.
אם נריץ עכשיו את האתר אנחנו נראה את תיבת התחברות.
ניתן להוריש משתנה מה-action אל הרנדר. בפונקציה render אנו מורישים את המשתנים במערך. לדוגמה, אני רוצה להוריש את המשתנה date, שהוא יהיה שווה לתאריך. (במקרה הזה זה סתם מטופש, אבל זו הדוגמה היחידה שמצאתי.)
$this->render( "login" , array("date"=>date("d/m/Y")) );
עכשיו המשתנה date קיים ברנדר של ההתחברות, שזה אומר שאפשר להשתמש בו:
<h1>Login - <?php echo $date; ?></h1>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
קוד סופי:
protected/controller/MainController.php
<?php
class MainController extends CController
{
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
class MainController extends CController
{
public function actionIndex()
{
$this->render( "login" , array("date"=>date("d/m/Y")) );
}
public function actionHello($name="Guest")
{
echo "Hello $name";
}
}
?>
protected/views/main/login.php
<h1>Login - <?php echo $date; ?></h1>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
<?php
if(isset($_POST['login']))
{
if($_POST['username'] == "admin" && $_POST['password'] == "admin")
{
echo "Your Wellcome Admin";
}
else
{
echo "The Details Are Wrong";
}
}
?>
<form action="" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="login" value="Log In" /></td>
</tr>
</table>
</form>
תגובות לכתבה:
מדהים, כל הכבוד.
בשורה אחת אפשר לסכם שהקונטרולר והאקשן שיופעלו נבחרים על ידי הערך המועבר ב $_GET['r']
יש מיפוי אוטומתי בין פרמטרים בכתובת שמעבירים ב GET לבין פרמטרים שאותו אקשן מקבל.
כמובן שבאמצעות ניטוב כתובת עם urlManager אפשר להיסתדר גם בלי להעביר את שם הקונטרוללר והאקשן בעומד חד ישיר בכתובת. אני מקווה שזה יהיה במדריך הבא.
הייתי רק מציין שאת הלוגיקה והבדיקה של האם קיים משתמש או לא והאם הוא אדמין עדיף לשים בקונטרולר, שזה הייעוד שלו, וב view רק להציג את הערך שהועבר לו מהקונטרולר. באופן כללי ל YII יש מנגנון הזדהות, מנגנון חלוקת תפקידים (למשתמשים רגילים ואדמניםי ומפקחים ומאפיה וכל דבר אחר) שעדיף להישתמש בו.
בורב המקרים אפילו לא תעבירו ל view את שם המשתמש, אלה ישר תרנרדרו view אחר למשתמשים מזוהים ומשתמשים לא מזוהים.
אני לא מתכונן לדבר על urlManger במדריך הבא כי אפילו לא הגעתי למודלים וכל מה שהארצי הם סתם דוגמאות לא היה לי רעיון לדוגמה נורמלית
תודה על התגובה אני אעשה את המדריך הבא רק אם יהיה תגובות
תלך באיזה סדר שתחשוב לנכון :-)
אני הייתי ממליץ בכל זאת למחוק את הבדיקה מהווי והלעבירה לקונטרולר, גם יהיה תקני יותר וגם דוגמה נוספת לפרמטרים ברנדר.
אהבתי מאוד, כל הכבוד!
אופן העבודה בפריימוורק הזה הוא פשוט נוח ומצוין.
מחכה לבא :)
מדריך ע-נ-ק! D=
תמשיך ככה! אתה לא מבין כמה חיכיתי למדריך כזה! כל הכבוד על ההשקעה!
אני מחכה כבר בקוצר רוח למדריך הבא!!!
אתה ענק! יוזמה גדולה , מדריך מצויין ! :)))
מחכה לבא !
אני רק שאלה.
מה זה בדיוק אומר לרנדר..?
לדעתי יש למילה הזאת כבר ירוש מילוני והמשמעוט שלה היא להציג תוצר סופי על המסך.
במקרה שלנו זה לייצר HTML אחרי זה יישלח לדפדפן.
חייב לדעת עוד על YII, מאיפה אפשר ללמוד ?
איפה אפשר למצוא מידע על מודלים ובעברית ?
בעברית אפשר רק עם מילון. בכלל לדעתי לתכנת בלי לדעת אנגלית אי אפשר.
מה שכן, יש את האתר
http://he.yiiframework.co.il/
אם די הרבה חלקים מתורגמים מהאתר המקורי
מתי יהיה המשך?
לפי דעתי הפראים ווארק הזה ממש לא מובן!
למה שלא יעשו כמו ב .NET שיש רק framework אחד נורמאלי?
ויש רק תוכנה אחד שיש בה הכל(קומפלוייר, עורך טקסט - IDE ושרת וואב)?
זה פרימוורק ממש נוח O.ם
@משתמש_75180 ולמה שכן יעשו דבר כזה?
אתה יוצא מוגבל לגמרי. כאן יש לך חופש בחירה לכל דבר - שרת וואב, פריימוורק, IDE
אף אחד לא באמת צריך חבילת all-in
הרבה יותר נוח להחליט לבד מה סביבת העבודה שלך מאשר שמישהו אחר יחליט בשבילך
zend מצעיעים לך פתרון all in
zend server + zend studio + zend framework + zend cloud + עוד כמה
וגם המחיר יוצא יותר זול מזה של MS
ההמשך בקרוב :)
@ilikeme תודה ;)
אתה ממש עוזר